///@file MVDataAgentXML.h 定义 CMVDataAgentXML ， 实现XML形式的数据访问
#ifndef _MVDATA_AGENT_XML_H_
#define _MVDATA_AGENT_XML_H_

#include "MVDataAgent.h"
#include "tinyxml.h"

class CMVDataSubSubMB;

//TODO: move these to a class
extern const char * FrameTypeStringMap[];		///< XML文件中Frame类型字符串到枚举类型 TYPE_FRAME 的映射
extern const char * MBTypeStringMap[];			///< XML文件中Macro Block类型字符串到枚举类型 TYPE_MB 的映射
extern const char * SubMBTypeStringMap[];		///< XML文件中Sub Macro Block类型字符串到枚举类型 TYPE_SUB_MB 的映射
extern const char * LocStringMap[];			///< XML文件中SubMB以及SubSubMB的Location字符串到枚举类型 LOC_BLOCK 的映射

///@brief 实现XML文件的操作
class CMVDataAgentXML : public CMVDataAgent
{
	friend class CMVDataAgent;

//============================== 一般方法 ====================================
protected:
	// 不允许直接创建对象，要通过工厂方法
	CMVDataAgentXML( CMVData * mvdata, const std::string dataname );
	virtual ~CMVDataAgentXML();

public:
	// 从XML文件中读出数据，读到绑定的CMVData中
	virtual int ReadMVData();
	// 向XML文件中写入数据，数据来自绑定的CMVData
	virtual int WriteMVData();
	
	virtual int Close();

private:
	// 将XML文件中的Frame类型字符串转化为枚举类型
	TYPE_FRAME _ConvertStrToFrameType( const char * frametype );

	// 将XML文件中的Macro Block类型字符串转化为枚举类型
	TYPE_MB _ConvertStrToMBType( const char * mbtype );

	// 将XML文件中的Sub Macro Block类型字符串转化为枚举类型
	TYPE_SUB_MB _ConvertStrToSubMBType( const char * submbtype );

	// 将XML文件中的where（位置）字符串转化为枚举类型
	LOC_BLOCK _ConvertStrToLocation( const char * loc );


	// 分别从XML文件中读出数据并转化为各种结构
	CMVDataFrame * _ReadFrame( TiXmlElement * frame_ele );
	CMVDataMB * _ReadMB( TiXmlElement * mb_ele );
	CMVDataSubMB * _ReadSubMB( TiXmlElement * sub_mb_ele );
	CMVDataSubSubMB * _ReadSubSubMB( TiXmlElement * sub_sub_mb_ele );

	void _ReadPredMV( TiXmlElement * pre_mv_ele, int& vx, int& vy );


};



#endif // _MVDATA_AGENT_XML_H_
